package com.qiangesoft.mybatisplus.util;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.nio.file.Paths;
import java.util.Collections;

/**
 * 代码生成器
 *
 * @author qiangesoft
 * @since 2024-07-29
 */
public class MiddleCodeGenerator {

    public static void main(String[] args) {
        // 项目根路径，如果是多模块，后面加上模块名称
        String path = Paths.get(System.getProperty("user.dir")).toString();

        FastAutoGenerator
                // 数据库连接信息（必须）
                .create("jdbc:mysql://127.0.0.1:3306/ozo_cloud?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false",
                        "root", "root")
                // 数据源配置（可选）
//                .dataSourceConfig(builder -> builder
//                        .schema("test") // 模式名称，部分数据库适用如ORACLE
//                )
                // 全局配置（必须）
                .globalConfig(builder -> builder
                        .author("qiangesoft") // 作者
                        .enableSwagger() // 开启swagger模式，与springdoc不可同时使用
//                        .enableSpringdoc() // 开启springdoc模式，与swagger不可同时使用
                        .outputDir(path + "/src/main/java") // 输出目录
                        .commentDate("yyyy-MM-dd") // 文件注释日期格式
                        .dateType(DateType.TIME_PACK) // 时间:util,sql,time
                        .disableOpenDir() // 禁止打开
                )
                // 包配置（必须）
                .packageConfig(builder -> builder
                        .parent("com.qiangesoft.demo") // 设置包路径
//                        .moduleName("system") // 设置父包模块名
                        .entity("entity")
                        .mapper("mapper")
                        .service("service")
                        .serviceImpl("service.impl")
                        .pathInfo(Collections.singletonMap(OutputFile.xml, path + "/src/main/resources/mapper")) // 设置mapperXml生成路径
                )
                // 策略配置（可选）
                .strategyConfig(builder -> builder
                        .addInclude("sys_user", "sys_role") // 设置需要生成的表名
//                        .addTablePrefix("sys_") // 设置过滤表前缀，设置后文件名会去除
                        // entity配置
                        .entityBuilder()
                        .enableLombok() // lombok风格
                        .naming(NamingStrategy.underline_to_camel) // 实体命名,下划线转驼峰
                        .columnNaming(NamingStrategy.underline_to_camel) // 字段命名,下划线转驼峰
                        .idType(IdType.AUTO) // id类型，可根据实际配置
                        .versionColumnName("version") // 版本号字段
                        .logicDeleteColumnName("deleted") // 逻辑删除字段
                        .addTableFills(new Column("create_time", FieldFill.INSERT)) // 字段填充
                        .enableFileOverride() // 文件覆盖
                        // mapper配置
                        .mapperBuilder()
                        .enableMapperAnnotation() // @Mapper注解
                        .enableBaseResultMap()
                        .enableBaseColumnList()
                        .enableFileOverride() // 文件覆盖
                        // service配置
                        .serviceBuilder()
//                        .disableService() // 禁用接口
                        .enableFileOverride() // 文件覆盖
                        // controller配置
                        .controllerBuilder()
                        .enableRestStyle() // 启用REST风格
                        .enableHyphenStyle() // 启用连字符风格
                        .enableFileOverride() // 文件覆盖
                )
                // 模板引擎（可选）
                .templateEngine(new VelocityTemplateEngine())
                // 执行
                .execute();
    }
}
